/**
 * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return int整型
 */
 function lengthOfLongestSubstring( s ) {
  // write code here
  // 定义一个字典来记录每一个字符在之前遍历的时候所出现位置的下标
  let lastPos = {}
  let i = -1 // 将左边界初始化为-1
  let j = 0 // 从字符的最左边开始遍历
  var res = 0 // 初始化结果
  while(j < s.length){ // 当j在s字符串内的时候就继续循环
    if(lastPos.hasOwnProperty(s[j])){ // 如果字典里已经有了这个属性了 
      i = lastPos[s[j]] > i ? lastPos[s[j]] : i // 修改左边界的值 改成这个字符最后一次出现的位置 和 当前边界 两者之间的最大值
    }
    lastPos[s[j]] = j // 将当前字符最后以次出现的位置记录在字典里 // 修改这个字符最后一次出现的位置
    res = res > j - i ? res : j - i // 判断已经记录的结果和当前下标-上一次出现的下标 谁大 取大的
    j++ // j后移一位
  }
  return res // 最终返回结果
}
module.exports = {
  lengthOfLongestSubstring : lengthOfLongestSubstring
};